// 创建一个Observer实例，对data进行数据劫持，拦截data的读取和修改
class Observer {
    constructor(data) {
        this.walk(data)
    }
    
    walk(data) {
        if (!data || typeof data !== 'object') return;
        Object.keys(data).forEach(key => {
            this.proxyData(data, key, data[key])
        })
    }
    
    proxyData(obj, key, value) {
        // 递归处理
        this.walk(value)
        const self = this
        const dep = new Dep()
        Object.defineProperty(obj, key, {
            enumerable: true, // 可枚举
            configurable: true, // 可以被配置
            get() {
                console.log('observer.js');
                console.log('observer.js', Dep.target);
                Dep.target && dep.addSub(Dep.target)
                return value
            },
            set(newValue) {
                if (newValue === value) return // 相同值不处理
                value = newValue
                self.walk(newValue) // 如果新值是对象，就继续递归处理
                // 触发通知 更新视图
                dep.notify()
                console.log(`监听到${key}属性变化，新值为：${newValue}`)
            }
        })
    }
}
